/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ctrl.jeu;

import view.com.PgButton;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import ctrl.sys.ClientSend;
import ctrl.sys.Const;
import ctrl.sys.Demande;

/**
 *
 * @author Willy
 */
public class Chaise implements Comparable{
    private int id;
    private static int idCourant=0;
    private int x;
    private int y;
    private int x_mise;
    private int y_mise;
    private int largeur;
    private int hauteur;
    public JPanel pan;
    private JLabel lab;
    private JProgressBar compteur;
    public JButton sit;
    private Container Fenetre=null;
    private Place lieu;
    private Table tb;
    
    // constructeur
    public Chaise(int x, int y, int largeur, int hauteur, Table t) {
        this.id = t.getChaises().size();
        idCourant++;
        this.x = x;
        this.y = y;
        this.largeur = largeur;
        this.hauteur = hauteur;
        this.tb=t;
        initComponent();
    }

    public Chaise(int x, int y, int largeur, int hauteur, Table t,int x1, int y1) {
        this.id = t.getChaises().size();
        idCourant++;
        this.x = x;
        this.y = y;
        this.largeur = largeur;
        this.hauteur = hauteur;
        this.tb=t;
        this.x_mise=x1;
        this.y_mise=y1;
        initComponent();
    }

    
    public void initComponent()
    {
        lab=new JLabel("0");
        pan=new JPanel();
        compteur = new JProgressBar(1,Const.TEMPS_JOUEUR/100);
        sit=new PgButton("SIT","boutonsit.png");

        sit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {

            if(getLieu()==null)
            {
                pan.remove(sit);
                String reponse;
                String message = "Donnez le montant de votre Mise : [ Min : "+tb.getMontMinimumEntree()+" -- Max: "+tb.getMontMaximumEntree()+" ]";
                reponse = JOptionPane.showInputDialog(pan, message);
                if(reponse!=null) {
                    Demande as=new Demande(Const.SIT,(new Float(reponse)).floatValue(),tb.getId(),getId());
                    as.setJ(tb.Play);
                    System.out.println("Demande de sit lancée");
                    
                    new ClientSend(tb.ClientReseau.getClient(), as).start();
                //getLieu().setPlayer(new Joueur("KONGUEM","Willy", 500));
                //Fenetre.repaint();
                }
            }

        }
        });
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    /**
     * Méthode qui permet d'assigner une place(representation abstraite) à une chaise(representation graphique)
     * @param p liste des places
     */
    public void CreeAction(ArrayList<Place> p)
    {
        for(int i=0;i<p.size();i++)
        {
            if(p.get(i).getIdChaise()==this.getId())
            {
                setLieu(p.get(i));
                break;
            }
        }
    }
    public Place getLieu() {
        return lieu;
    }

    public void setLieu(Place lieu) {
        this.lieu = lieu;
    }


    public JProgressBar getCompteur() {
        return compteur;
    }

    public void setCompteur(JProgressBar compteur) {
        this.compteur = compteur;
    }

    public JLabel getLab() {
        return lab;
    }

    public void setLab(JLabel lab) {
        this.lab = lab;
    }

    public JPanel getPan() {
        return pan;
    }

    public void setPan(JPanel pan) {
        this.pan = pan;
    }

    public JButton getSit() {
        return sit;
    }

    public void setSit(JButton sit) {
        this.sit = sit;
    }

    public int getHauteur() {
        return hauteur;
    }

    public int getLargeur() {
        return largeur;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getX_mise() {
        return x_mise;
    }

    public void setX_mise(int x_mise) {
        this.x_mise = x_mise;
    }

    public int getY_mise() {
        return y_mise;
    }

    public void setY_mise(int y_mise) {
        this.y_mise = y_mise;
    }



    public void Affiche(Container cont,int x,int y, Place p)
    {
        //System.out.println(getPlayer());
        Fenetre=cont;
        pan.setBounds(x+getX(),y+ getY(), getLargeur(), getHauteur());
        pan.setLayout(new BorderLayout());
        
        cont.add(pan);
        if(getLieu()!=null) // si une personne est assis sur cette place
        {
            //afichage des mises si possible
            Mise m=tb.getMises(getLieu());
            if(m!=null)
                if(m.isFirstDisplay())
                {
                    m.Deplace(tb.Fenetre, x+getX()+getX_mise(), y+getY()+getX_mise(), x, y);
                    m.setFirstDisplay(false);
                }
                else
                {
                    m.Affiche(tb.Fenetre,x+getX()+getX_mise(),y+getY()+getY_mise());
                }
            if(getLieu().getPlayer()!=null)
            {
                sit.setVisible(false);
                pan.add(lab,BorderLayout.SOUTH);
                pan.add(compteur,BorderLayout.NORTH);
                lab.setText(getLieu().getMontantPartie()+"");
                ImageIcon imgi=null;
                try {
                    try {
                        imgi=new javax.swing.ImageIcon(new URL(getLieu().getPlayer().getPhoto()));
                    }catch (Exception e)
                    {
                        imgi=new javax.swing.ImageIcon(getClass().getResource("/img/defauthomme.png"));
                    }

                }catch(Exception e) {}

                if(imgi!=null)
                {
                    Image im=imgi.getImage();
                    im=scale(im,80,60);

                    JLabel l=new JLabel(new ImageIcon(im));
                    l.setLayout(new BorderLayout());
                    l.setSize(80,80);
                    l.setToolTipText(getLieu().getPlayer().toString());
                    pan.add(l);
                }
                

                // affiche les cartes
                for(int k=0;k<getLieu().getCard().length;k++)
                {
                    Carte c=getLieu().getCard()[k];
                    if((c!=null)&&(getLieu().getIdChaise()==this.getId()))
                    {
                        if(getLieu().equals(tb.getPlaceMain()))
                        {
                            c.AfficheMini(cont, x+getX()+90+(k*51), y+getY()+25);
                            
                        } else { c.AfficheDos(cont, x+getX()+90+(k*46), y+getY()+25); }
                        
                    }
                }

            }
            
        }
        else
        {
            pan.add(sit,BorderLayout.CENTER);
            if(tb.getPlaceMain()!=null)
            {
                sit.setEnabled(false);
                //System.out.println("personne");
            }
        }
    }

    @Override
    public String toString() {
        return "IdCh: "+getId()+" pl="+getLieu();
    }


    @Override
    public boolean equals(Object obj) {
        if(obj!=null)
        if(obj instanceof Chaise)
        {
            return getId()==((Chaise)obj).getId();
        }
        return false;
    }

    public int compareTo(Object o) {
        return this.getId()-((Chaise) o).getId();
    }


    // main
    public static void main(String[] args)
    {

    }

    /**
     * Redimensionne une image.
     *
     * @param source Image à redimensionner.
     * @param width Largeur de l'image cible.
     * @param height Hauteur de l'image cible.
     * @return Image redimensionnée.
     */
    public static Image scale(Image source, int width, int height) {
        /* On crée une nouvelle image aux bonnes dimensions. */
        BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

        /* On dessine sur le Graphics de l'image bufferisée. */
        Graphics2D g = buf.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.drawImage(source, 0, 0, width, height, null);
        g.dispose();

        /* On retourne l'image bufferisée, qui est une image. */
        return buf;
    }

}
